/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.elka.wdec.utils;

import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.Collections;

/**
 *
 * @author michal
 */
public class Model
{
    private ZyskMinMax zyskMinMax = new ZyskMinMax();
	public Model()
	{
		this.stanPoczatkowy = new StanPoczatkowy();
                //TODO aktualny kredyt
                this.etap = new Etap(1, StanPoczatkowy.majatekTrwaly, StanPoczatkowy.iloscGotowki, 0, 0);
                this.zbiorRozwiazan = new TreeMap<Integer, List<Rozwiazanie>>();
	}

	public StanPoczatkowy getStanPoczatkowy()
	{
		return stanPoczatkowy;
	}
	
        public Etap getBiezacyEtap()
        {
            return etap;
        }
        
        public GeneratorRozwiazan getGenerator()
        {
            return generatorRozwiazan;
        }
        
        public TreeMap<Integer, List<Rozwiazanie>> getZbiorRozwiazan()
        {
            return zbiorRozwiazan;
        }
        
        public Rozwiazanie getNajlepszeRozwiazanie(Integer ryzyko)
        {
            if (ryzyko < 0 || ryzyko > 100) return null;
            
            // zwroc pierwsze rozwiazanie z listy - najlepsze
            // jesli zbior nie jest pusty oraz jesli dla danego ryzyka mamy liste
            if(zbiorRozwiazan != null && !(zbiorRozwiazan.isEmpty()) && zbiorRozwiazan.get(ryzyko) != null && (!zbiorRozwiazan.get(ryzyko).isEmpty()))
            {
                return zbiorRozwiazan.get(ryzyko).get(0);
                //return new Rozwiazanie(rozwiazanie.getWolumen(), rozwiazanie.getJakosc(), rozwiazanie.getCena(), rozwiazanie.getReklama(), rozwiazanie.getKredyt(),rozwiazanie.getWzietyKredyt(),rozwiazanie.getDostepnaGotowka(),rozwiazanie.getRyzyko(),zyskMinMax.normalizeZysk(rozwiazanie.getZysk()),rozwiazanie.getKosztJednostkowy());
            }
            return null;
        }
        
        public void generujRozwiazania()
        {
            this.generatorRozwiazan = new GeneratorRozwiazan(20000, (int)stanPoczatkowy.maxProdukcja, 20000, 5, 100, 5, 16, 25, 1, 50000, 300000, 25000, 0, (int)stanPoczatkowy.maxKredyt, (int)stanPoczatkowy.maxKredyt/20);
            Map<Integer, List<Rozwiazanie>> zbior = generatorRozwiazan.generujRozwiazania(zyskMinMax);
            
            // utworzenie zbioru posortowanego po kluczach
            zbiorRozwiazan = new TreeMap<Integer, List<Rozwiazanie>>(zbior);
            
            // sortowanie rozwiazan od najlepszego do najgorszego dla danego ryzyka
            for (Integer i : zbiorRozwiazan.keySet())
            {
                Collections.sort(zbiorRozwiazan.get(i));
            }
        }
        
        public void nastepnyEtap(Rozwiazanie rozwiazanie)
        {
            int numerEtapu = etap.getNumerEtapu();
            if (++numerEtapu > 4) return; //4. etap jest ostatnim
            
            long majatekTrwaly = etap.getMajatekTrwaly();
            long iloscGotowki = etap.getIloscGotowki();
            int aktualnyKredyt = etap.getAktualnyKredyt();
            int niesprzedanePoprzednio = etap.getNiesprzedanePoprzednio();
            
            //TODO wyznaczanie wartosci dla generatora, kredyt?
            int minWolumen = 0;
            int maxWolumen = (int)((rozwiazanie.getZysk() + rozwiazanie.getDostepnaGotowka() + rozwiazanie.getKredyt() - StanPoczatkowy.kosztyStale) / (rozwiazanie.getKosztJednostkowy() * rozwiazanie.getWolumen()));
            if (maxWolumen > 400000) maxWolumen = 400000;
            int krokWolumenu = maxWolumen / 10;
            
            int minJakosc = 0;
            int maxJakosc = 100;
            int krokJakosc = 10;
            
            int minCena = 16;
            int maxCena = 25;
            int krokCena = 1;
            
            int minReklama = 50000;
            int maxReklama = 300000;
            int krokReklama = 25000;
            
            int minKredyt = 0;
            int maxKredyt = 800000;
            int krokKredyt = 50000;
            
            majatekTrwaly = majatekTrwaly - stanPoczatkowy.amortyzacja;
            
            etap = new Etap(numerEtapu, majatekTrwaly, iloscGotowki, aktualnyKredyt, niesprzedanePoprzednio);
            
            //TODO zapewnic nowe dane dla generatora
            
            generatorRozwiazan = new GeneratorRozwiazan(minWolumen, maxWolumen, krokWolumenu, minJakosc, maxJakosc, krokJakosc, minCena, maxCena, krokCena, minReklama, maxReklama, krokReklama, minKredyt, maxKredyt, krokKredyt);
        }
        
	private StanPoczatkowy stanPoczatkowy;
        private Etap etap;
        private GeneratorRozwiazan generatorRozwiazan;
        private TreeMap<Integer, List<Rozwiazanie>> zbiorRozwiazan;
}
